package com.ims.business.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.ims.business.constant.BusCons;
import com.ims.business.model.Token;
import com.ims.business.model.WechatUserModel;
import com.ims.common.matatype.Dto;
import com.ims.common.matatype.Dtos;
import com.ims.common.matatype.impl.HashDto;
import com.ims.common.util.HttpUtil;
import com.ims.common.util.IMSUtil;
import com.ims.common.util.JsonUtil;
import com.ims.system.util.CacheCxt;

/**
 * 
 * 类名:com.ims.business.util.ThirdApiUtil
 * 描述:第三方接口工具类
 * 编写者:陈骑元
 * 创建时间:2019年7月15日 上午8:42:53
 * 修改说明:
 */
@Component
public class ThirdApiUtil {
	private static Log log = LogFactory.getLog(ThirdApiUtil.class);
	;
	/**
	 * 返回的错误代码信息
	 */
	public static String RETURN_ERROR_INFO_CODE = "errcode";
	
	/**
	 * 通过code换取网页授权access_token URL地址
	 */
	public static final String  OAUTH2__TOKEN_URL="https://api.weixin.qq.com/sns/oauth2/access_token?1=1";
	
	public static final String  JS_CODE_URL="https://api.weixin.qq.com/sns/jscode2session?1=1";
	/**
	 * 通过网页授权获取用户信息
	 */
	public static final String  OAUTH2__URER_URL="https://api.weixin.qq.com/sns/userinfo?1=1";
	
	
	public static final String  TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?1=1";
	
	private static String appID;
	private static String appsecret;
	@Value("${applet.appID}")
	public  void setAppID(String appID) {
		ThirdApiUtil.appID = appID;
	}
	
	@Value("${applet.appsecret}")
	public  void setAppsecret(String appsecret) {
		ThirdApiUtil.appsecret = appsecret;
	}
	
	/**
	 * 
	 * 简要说明：获取accessToken
	 * 编写者：陈骑元
	 * 创建时间：2019年8月11日 下午11:20:09
	 * @param 说明
	 * @return 说明
	 */
	public static String getAccessToken(){
		String accessToken=CacheCxt.getString(BusCons.ACCESS_TOKEN_KEY);
		if(IMSUtil.isEmpty(accessToken)){
			Dto paramDto=Dtos.newDto();
			paramDto.put("appid", appID);
			paramDto.put("secret", appsecret);
			paramDto.put("grant_type", "client_credential");
			String returnMsg=HttpUtil.doGet(TOKEN_URL,paramDto);
			log.info("获取小程序授权token返回信息："+returnMsg);
			Dto returnDto=JsonUtil.fromJson(returnMsg, HashDto.class);
			String errcode=returnDto.getString(RETURN_ERROR_INFO_CODE);
			if(IMSUtil.isNotEmpty(errcode)){
				log.error("获取小程序授权token返回信息："+returnMsg);
				return null;
			}
			 accessToken=returnDto.getString("access_token");
			 CacheCxt.setString(BusCons.ACCESS_TOKEN_KEY, accessToken, 7200);
			 
		}
		
		return accessToken;
		
	}
	/**
	 * 
	 * 简要说明：获取网页授权用户信息
	 * 编写者：陈骑元
	 * 创建时间：2017年5月20日 下午3:14:37
	 * @param 说明
	 * @return 说明
	 */
	public static  WechatUserModel getOAuthUserInfo(String code) {
	   String openid=getAppletOpenid(code);
	   if(IMSUtil.isNotEmpty(openid)){
		   String  accessToken=getAccessToken();
		   if(IMSUtil.isNotEmpty(accessToken)){
			   return getOauthUserInfo(accessToken, openid);
		   }
		  
	   }
	   return null;
	   
	}
	
	/**
	 * 
	 * 简要说明：获取网页授权的用户信息
	 * 编写者：陈骑元
	 * 创建时间：2017年5月20日 下午3:04:10
	 * @param 说明  网页授权access_token 用户openid;
	 * @return 说明
	 */
	public static WechatUserModel getOauthUserInfo(String access_token,String openid){
		Dto paramDto=Dtos.newDto();
		paramDto.put("access_token", access_token);
		paramDto.put("openid", openid);
		paramDto.put("lang", "zh_CN");
		String returnMsg=HttpUtil.doGet(OAUTH2__URER_URL,paramDto);
		log.info("网页授权获取微信用户基本信息接口返回信息："+returnMsg);
		Dto returnDto=JsonUtil.fromJson(returnMsg, HashDto.class);
		String errcode=returnDto.getString(RETURN_ERROR_INFO_CODE);
		if(IMSUtil.isNotEmpty(errcode)){
			log.error("网页授权获取微信用户基本信息接口返回信息："+returnMsg);
			return null;
		}
		
		WechatUserModel  wechatUser=new WechatUserModel();
		IMSUtil.copyProperties(returnDto,wechatUser); 
		return wechatUser;
	}
	/**
	 * 
	 * 简要说明：获取openid
	 * 编写者：陈骑元
	 * 创建时间：2019年8月11日 下午11:14:38
	 * @param 说明
	 * @return 说明
	 */
	public static String getAppletOpenid(String code){
		Dto paramDto=Dtos.newDto();
		paramDto.put("appid", appID);
		paramDto.put("secret", appsecret);
		paramDto.put("js_code", code);
		paramDto.put("grant_type", "authorization_code");
		String returnMsg=HttpUtil.doGet(JS_CODE_URL,paramDto);
		log.info("获取微信小程序授权接口返回信息："+returnMsg);
		Dto returnDto=JsonUtil.fromJson(returnMsg, HashDto.class);
		String errcode=returnDto.getString(RETURN_ERROR_INFO_CODE);
		if(IMSUtil.isNotEmpty(errcode)){
			log.error("获取微信小程序授权接口返回信息口出错,错误信息："+returnMsg);
			return null;
		}
		return returnDto.getString("openid");
	}
	/**
     * 
     * 简要说明：通过code换取网页网页授权accessToken
     * 编写者：陈骑元
     * 创建时间：2017年5月20日 上午10:46:40
     * @param 说明
     * @return 说明
     */
	public static Token getOauth2Token(String code){
		Dto paramDto=Dtos.newDto();
		paramDto.put("appid", appID);
		paramDto.put("secret", appsecret);
		paramDto.put("code", code);
		paramDto.put("grant_type", "authorization_code");
		String returnMsg=HttpUtil.doGet(OAUTH2__TOKEN_URL,paramDto);
		log.info("获取微信网页授权接口返回信息："+returnMsg);
		Dto returnDto=JsonUtil.fromJson(returnMsg, HashDto.class);
		String errcode=returnDto.getString(RETURN_ERROR_INFO_CODE);
		if(IMSUtil.isNotEmpty(errcode)){
			log.error("获取微信网页授权接口返回信息口出错,错误信息："+returnMsg);
			return null;
		}
		Token  token=new Token();
	    token.setAccessToken(returnDto.getString("access_token"));
	    token.setExpiresIn(returnDto.getInteger("expires_in"));
	    token.setRefreshToken(returnDto.getString("refresh_token"));
	    token.setOpenid(returnDto.getString("openid"));
	    token.setRefreshToken(returnDto.getString("scope"));
		return token;
	}
	

}
